#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
快速设置开发环境脚本
用于创建虚拟环境并安装必要的开发工具
"""

import os
import sys
import subprocess
import venv
import shutil

# 获取脚本所在目录作为项目根目录
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
VENV_DIR = os.path.join(PROJECT_ROOT, "venv")


def get_venv_python():
    """获取虚拟环境中的Python解释器路径"""
    if sys.platform.startswith("win"):
        return os.path.join(VENV_DIR, "Scripts", "python.exe")
    else:
        return os.path.join(VENV_DIR, "bin", "python")


def check_venv_valid():
    """检查虚拟环境是否有效"""
    if not os.path.exists(get_venv_python()):
        return False
    
    # 检查pip是否可用
    try:
        result = subprocess.run(
            [get_venv_python(), "-m", "pip", "--version"],
            capture_output=True,
            text=True,
            timeout=10
        )
        return result.returncode == 0
    except:
        return False


def create_virtual_environment():
    """创建虚拟环境"""
    print(f"\n[1/3] 正在创建虚拟环境，路径: {VENV_DIR}")
    
    # 检查虚拟环境是否有效
    if check_venv_valid():
        print("✅ 检测到有效虚拟环境，将直接使用")
        return True
    
    # 如果虚拟环境目录存在但无效，尝试重命名而不是删除
    if os.path.exists(VENV_DIR):
        backup_dir = VENV_DIR + "_backup"
        # 如果备份目录已存在，先删除它
        if os.path.exists(backup_dir):
            try:
                shutil.rmtree(backup_dir)
            except:
                pass
        
        try:
            print(f"⚠️  检测到无效虚拟环境，将重命名为: {backup_dir}")
            os.rename(VENV_DIR, backup_dir)
        except Exception as e:
            print(f"⚠️  无法重命名虚拟环境目录: {str(e)}")
            print("💡 提示: 请手动删除或重命名venv目录后重试")
            # 继续尝试创建，可能会失败但至少会给出明确的错误信息
    
    # 尝试创建新的虚拟环境
    try:
        print("🔧 正在创建新的虚拟环境...")
        # 使用ensurepip确保pip被安装
        venv.create(VENV_DIR, with_pip=True)
        
        # 验证pip是否可用
        if check_venv_valid():
            print("✅ 虚拟环境创建成功")
            return True
        else:
            print("❌ 创建的虚拟环境缺少pip，环境无效")
            # 尝试手动安装pip
            try:
                print("🔧 尝试手动安装pip...")
                import ensurepip
                ensurepip.bootstrap(root=VENV_DIR)
                if check_venv_valid():
                    print("✅ pip安装成功")
                    return True
            except Exception as e:
                print(f"❌ 手动安装pip失败: {str(e)}")
            return False
    except Exception as e:
        print(f"❌ 创建虚拟环境失败: {str(e)}")
        return False


def install_pip_if_missing():
    """如果pip缺失，尝试安装它"""
    if check_venv_valid():
        return True
    
    try:
        print("\n🔧 尝试安装pip...")
        import ensurepip
        ensurepip.bootstrap(root=VENV_DIR)
        return check_venv_valid()
    except Exception as e:
        print(f"❌ 安装pip失败: {str(e)}")
        return False


def upgrade_pip():
    """升级pip到最新版本"""
    print("\n[2/3] 正在升级pip...")
    
    # 确保pip可用
    if not check_venv_valid():
        if not install_pip_if_missing():
            print("❌ pip不可用，无法升级")
            return False
    
    try:
        venv_python = get_venv_python()
        cmd = [venv_python, "-m", "pip", "install", "--upgrade", "pip", 
               "-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]
        subprocess.check_call(cmd)
        print("✅ pip升级成功")
        return True
    except Exception as e:
        print(f"❌ pip升级失败: {str(e)}")
        # 继续执行，不阻断流程
        return False


def install_core_tools():
    """安装核心开发工具"""
    print("\n[3/3] 正在安装核心开发工具...")
    
    # 确保pip可用
    if not check_venv_valid():
        print("❌ pip不可用，无法安装开发工具")
        return False
    
    try:
        venv_python = get_venv_python()
        
        # 首先安装一些常用的开发工具
        tools = [
            "wheel",  # 用于安装wheel包，加速依赖安装
            "setuptools",
        ]
        
        # 分批次安装，先安装基础工具
        print("🔧 正在安装基础工具...")
        cmd = [venv_python, "-m", "pip", "install"] + tools + \
              ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]
        subprocess.check_call(cmd)
        
        # 然后安装开发工具
        dev_tools = [
            "ipython",  # 增强的Python交互式shell
            "pytest",  # 测试框架
            "black",  # 代码格式化工具
            "isort",  # 导入语句排序工具
            "flake8"   # 代码检查工具
        ]
        
        print("🔧 正在安装开发工具...")
        cmd = [venv_python, "-m", "pip", "install"] + dev_tools + \
              ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]
        subprocess.check_call(cmd)
        
        print("✅ 核心开发工具安装成功")
        print("\n🎉 开发环境设置完成！")
        print(f"\n📌 虚拟环境位置: {VENV_DIR}")
        print("\n使用方法:")
        if sys.platform.startswith("win"):
            print(f"  1. 激活虚拟环境: .\\venv\\Scripts\\activate")
        else:
            print(f"  1. 激活虚拟环境: source {VENV_DIR}/bin/activate")
        print("  2. 安装项目依赖: pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple")
        print("  3. 运行应用: python start.py")
        return True
    except Exception as e:
        print(f"❌ 安装核心开发工具失败: {str(e)}")
        print("💡 提示: 可以在激活虚拟环境后手动安装所需工具")
        return False


def main():
    """主函数"""
    print("🚀 瀚越包装方案匹配工具 - 开发环境设置")
    print("="*60)
    
    # 检查Python版本
    required_version = (3, 8)
    current_version = sys.version_info
    if current_version < required_version:
        print(f"❌ 错误: 需要Python {required_version[0]}.{required_version[1]} 或更高版本，当前版本是 {current_version[0]}.{current_version[1]}.{current_version[2]}")
        return 1
    
    # 创建虚拟环境
    if not create_virtual_environment():
        return 1
    
    # 升级pip
    upgrade_pip()
    
    # 安装核心开发工具
    install_core_tools()
    
    # 无论如何都返回成功，因为用户可以手动完成剩余步骤
    print("\n📋 设置脚本执行完成。如果有任何错误，请按照提示手动完成剩余设置。")
    return 0


if __name__ == "__main__":
    sys.exit(main())